Chod hore
Predchádzajúca stránka Nasledujúca stránka Začiatok kapitoly Koniec kapitoly Začiatok kurzu Koniec kurzu


7. JEDNODUCHÉ TYPY


V tomto paragrafe sa budeme zaoberať jednoduchými typmi. Typ je jednoduchý, ak nemá štruktúru (je neštruktúrovaný - skalárny). Takými sú celé, reálne, textové, logické, vymenované a intervalové typy.

Najprv pár slov o funkciách, lebo odteraz ich použitie nie je možné obísť. V matematike funkcia je také zobrazenie, ktoré priradí každej hodnote jednu jedinú hodnotu. Argumenty funkcie sú jej vstupné parametre a výstupom je jej hodnota. Funkcia môže nadobúdať iba hodnoty zo svojho oboru hodnôt. Napr. funkcia SIN(X) je definovaná pre všetky reálne čísla a každej reálnej hodnote priradí jednu reálnu hodnotu z uzavretého intervalu [-1,1]. Pripomíname, že interval je uzavretý, ak do nej patria jej koncové body - práve toto označujú hranaté zátvorky. Otvorené intervaly neobsahujú svoje koncové body a označujeme ich nasledovne (min,max). Funkcia môže mať aj viacero parametrov a dokonca sú aj bezparametrové funkcie napr. PI (je to známa hodnota z matematiky 3.14, len presnejšie).

Pre každú funkciu v Pascale je charakterné, že

  • koľko má parametrov,
  • jednoznačne sú určené typy jednotlivých parametrov,
  • jednoznačne je určený typ výslednej hodnoty.

Funkcie používame väčšinou vo výrazoch, vždy si predstavme na ich mieste tú hodnotu, ktorú nadobúdajú. Napríklad ak vo výraze môžeme na danom mieste použiť reálnu hodnotu, potom tam môžeme použiť aj reálnu funkciu (reálna funkcia je taká, výsledok ktorej je reálne číslo).

Úloha
Vypočítajte objem valca ak mame danú jeho výšku a polomer. Vstupné údaje nech sú v cm-och a výsledok nech je v m3.

Zdrojový program:

Obr7_1


Beh programu: Po úprave obrazovky (výpis stálych informácií) - kurzor nastavíme na prvú potrebnú pozíciu a načítame polomer valca. Užívateľ zadá potrebný údaj. Žiaľ, zatiaľ sme nechránený voči preklepom, lebo riadenie podprogramu ReadLn nie je v našich rukách. Tento podprogram umožňuje nasledujúce:

  • Užívateľ môže zadávať ľubovolné znaky - nie len číslice. Výsledkom čoho bude, že program zhavaruje, keď sa bude snažiť priradiť textovú hodnotu reálnej premennej.
  • Užívateľ môže napísať ľubovolne dlhý reťazec - hranica 127 znakov nie je veľkým obmedzením. Môže prepísať obsah obrazovky.
  • Užívateľ ak zadá iba klávesu ENTER, potom podprogram Read, bude naďalej očakávať hodnotu, ale kurzor sa posunie na začiatku nasledujúceho riadku.

Neskôr ukážeme ako sa dá kontrolovať vstup údajov. Funkcia SQR(X) vypočíta druhú mocninu čísla X.



7.1 Typy celých čísel


Pre celé typy v Pascale máme nasledujúce možností:

  • Byte [0,255] 1 Byte $FF
  • ShortInt [-128,127] 1 Byte $FF
  • Word [0,65 535] 2 Byte $FFFF
  • Integer [-32 768,32 767] 2 Byte $FFFF
  • LongInt [-2 147 483 648,2 147 483 647] 4 Byte $FFFFFFFF

Najjednoduchším z nich je typ Byte:
Var
B : Byte ;

Už ako názov napovedá zaberá 1 Byte pamäte. Teda môžeme ukladať čísla od 0 po 255 ($FF).

Výraz B := 256 je nesprávny a preklad sa ukončí syntaktickou chybou a prekladač oznámi nasledujúcu správu "Constant out of range" - hodnota mimo definičný obor.
Upozornenie! V prípade vypnutej kontroly príkazy B := 255 ; B := B+1 ; sa neobjaví chybové hlásenie, ale dôjde k pretečeniu premennej a ona nadobudne nulovú hodnotu - bez upozornenia.

Ďalším takým typom je ShortInt. Rozdiel je v tom, že v tomto prípade môžeme pracovať aj so zápornými číslami.
Najprehľadnejšie je ak si čísla predstavujeme v dvojkovom zápise. Napr. 5 bude v tomto prípade mať tvar 00000101. Kladné čísla majú prvú číslicu 0, záporné - 1. Napr. zobrazenie pre číslo -5 získame ak v tvare pre 5 vymeníme 0 za 1 a 1 za 0 a pričítame k upravenému dvojkovému číslu 1. T.j. 11111010+1=11111011 bude -5 v type ShortInt. To vysvetľuje "paradox", že ak B := 127 ; B := B+1 ; potom v premennej B bude hodnota -128.

Operácie s celočíselnými hodnotami (výsledok bude vždy celé číslo):

NOTnegácia po bitoch - jednozložková operácie
Not -15 = +14 ( Not 11110001 = 00001110 )
+,-znamienko - jednozložková operácie
*násobenie - dvojzložková operácia a takými budú všetky nasledujúce
12*3 = 36 6*-1 = -6
DIVceločíselné delenie
123 Div 4 = 30
MODzostatok po celočíselnom delení
123 Mod 4 = 3
ANDsčítanie po bitoch, výsledok je 1 na patričnom mieste, ak obe hodnoty boli 1
12 And 22 = 4

00001100 (12)
00010110 (22)
00000100 ( 4)
SHLposun po bitoch vľavo (SHift Left), príkaz A Shl N znamená posunutie N krát. Pri posune vľavo bity "vypadajú" z čísla a vpravo vstupujú nuly.
2 Shl 7 = 256
SHRposun po bitoch vpravo (SHift Right), príkaz A Shr N znamená posunutie N krát. Pri posune vpravo bity "vypadajú" z čísla a vľavo vstupujú nuly.
2 Shr 3 = 0
+sčítanie
-1+5 = 4
-odčítanie
201-205 = -4
ORnásobenie po bitoch, výsledok je 0 na patričnom mieste iba ak obe sú 0
12 Or 22 = 30

00001100 (12)
00010110 (22)
00011110 (30)
XORvylučovacie násobenie po bitoch, výsledok je 1 na patričnom mieste iba ak obe sú rôzne
12 Xor 22 = 26

00001100 (12)
00010110 (22)
00011010 (26)

Úloha
Jano dostane peniaze. Koľko, opýta sa program, ale nesmie byť viac než 65 535. K výplate máme k dispozícii bankovky v hodnote 5000, 1000, 500 a 100 Sk. Zbytok Jano nedostane. Predpokladáme, že z každej bankovky je dostatok a výplata musí byť realizovaná s minimálnym počtom bankoviek. Z akych bankoviek a koľko dostal Jano a koľko nechal tam darom?

Zdrojový program:

Obr7_2


V tomto programe by sme sa ľahko mohli dostať do "pasce". Počet bankoviek pri rozumných sumách by určite neprevyšoval číslo 255 a teda mohli by sme ich deklarovať ako typ Byte. Pri výpise by sme s hrôzou zistili, že počty sú aj záporné čísla. Čo je kameňom úrazu? Vec je v tom, že počítač pri násobení čísel, vždy sa riadi typom zložiek - v našom prípade 5000, 1000 a 500 nie sú typu Byte a teda ani výsledok nebude toho typu a pri konverzii na typ Byte by dochádzalo k nezrovnalostiam.

Typy celočíselných konštánt:

V prípade kladných čísel:

  • ak je medzi 0 a 255, potom je typu Byte,
  • ak nie, ale sa zmestí do rozpätia typu Integer, potom je typu Integer,
  • ak nie, ale sa zmestí do rozpätia typu Word, potom je typu Word,
  • ak nie, potom je typu LongInt

V prípade záporných čísel:

  • ak sa zmestí do rozpätia typu Integer, potom je typu Integer,
  • ak nie, potom je typu LongInt

V našom príklade v prípade 7 bankoviek (5000 Sk) bude situácia nasledovná:
7*5000 by bola typu - Byte*Integer, výsledok sa bude interpretovať ako typ Integer, ale hodnota 7*5000=35000 už je mimo rozpätia čísel typu Integer a tak by mohli vzniknúť záporné hodnoty.

Dec(I,N)podprogram znižuje hodnotu premennej I o hodnotu N.
V prípade N=1, druhý parameter môžeme vynechať.
Je rovnocenný príkazu: I := I-N ;

I := 8 ; Dec(I,2) ; { I bude 6 } Dec(I) ; { I bude 5 }
Inc(I,N)podprogram zvyšuje hodnotu premennej I o hodnotu N.
V prípade N=1, druhý parameter môžeme vynechať.
Je rovnocenný príkazu: I := I+N ;

I := 8 ; Inc(I,2) ; { I bude 10 } Inc(I) ; { I bude 11 }
Pred(I)táto funkcia vracia o jednotku menšiu hodnotu
I := 65 ; I := Pred(I) ; { I bude 64 }
Succ(I)táto funkcia vracia o jednotku väčšiu hodnotu
I := 65 ; I := Succ(I) ; { I bude 66 }
Abs(I)táto funkcia vracia absolútnu hodnotu I
I := -65 ; I := Abs(I) ; { I bude 65 }
Sqr(I)táto funkcia vracia druhú mocninu I
I := 9 ; I := Sqr(I) ; { I bude 81 }
Round(R)táto funkcia vracia najbližšiu celú hodnotu k reálnemu R, t.j. zaokrúhľuje R
R := 23.79 ; I := Round(R) ; { I bude 24 }
R := -23.79 ; I := Round(R) ; { I bude -24 }
Trunc(R)táto funkcia vracia celú časť hodnoty R, t.j. "odreže" časť čísla R za desatinnou bodkou
R := 23.79 ; I := Trunc(R) ; { I bude 23 }
R := -23.79 ; I := Trunc(R) ; { I bude -23 }
Hi(X)táto funkcia vracia hodnotu horného bytu v prípade, keď X je typu Integer alebo Word.
Lo(X)táto funkcia vracia hodnotu dolného bytu v prípade, keď X je typu Integer alebo Word.
Obr7_3

Úloha
Nech program si pýta výšku hodinovej mzdy Fera, potom hodnotu odpracovanej doby v hodinách a minútach (aj zlomky hodiny sa platia). Program nech vypočíta celkovú mzdu Fera zaokrúhlenú na jedno desatinné miesto.

Zdrojový program má nasledujúci tvar:

Obr7_4


Pri výpise vo výraze "Vyplata:0:2" 0 znamená, že výpis bude nasledovať hneď za reťazcom. Táto 0 znamená, že dopredu nevieme aké bude číslo, ale program z celej časti neorezáva číslice, teda vždy to bude korektné a výpis nebude obsahovať zbytočné nuly pred hodnotou.